﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;

namespace Traviesuras.Models
{
    public class clsAccesoDB
    {
        #region usuario
        public static bool Login(ref clsUsuario user)
        {
            try
            {
                string usua = user.nombre_usuario;
                byte[] contra = Encoding.UTF8.GetBytes(user.contrasenaString);
                DBEntity ent = new DBEntity();

                //var selectu = from q in ent.persona
                //              join w in ent.usuario on q.id_persona equals w.persona
                //              where (w.nombre_usuario == usua || q.email == usua) && q.contrasena == contra && q.estado != "I"
                //              select w;


                var selectu = from q in ent.usuario where usua == q.nombre_usuario && q.contrasena == contra && q.estado != "I" select q;
                if (selectu.Count() == 0) { return false; }
                var sel = selectu.First();
                try{
                    var selectpersona =( from q in ent.persona where q.id_persona==sel.persona select q).FirstOrDefault();
                        user.clsPersona.apellido = selectpersona.apellido;
                        user.clsPersona.direccion = selectpersona.direccion;
                        user.clsPersona.email = selectpersona.email;
                        user.clsPersona.id_persona = selectpersona.id_persona;
                        user.clsPersona.identificacion = selectpersona.identificacion;
                        user.clsPersona.imagen = selectpersona.imagen;
                        user.clsPersona.nombre = selectpersona.nombre;
                        user.clsPersona.nombres_completos = selectpersona.nombre+" "+selectpersona.apellido;
                        user.clsPersona.telefono = selectpersona.telefono;
                }catch (Exception){}

                user.estado = sel.estado;
                user.persona = Convert.ToInt32(sel.persona);
                user.id_usuario = sel.id_usuario;
                user.tipo_usuario = Convert.ToInt32(sel.tipo_usuario);
                user.contrasena = sel.contrasena;
                user.contrasenaString = "";
                return true;
            }
            catch (Exception ex)
            {
                //RegistroEvento(ex.Message + "------ INICIO SESION", user.id_usuario);
                return false;
            }
        }
        public static bool RecuperarLogin(ref clsUsuario user)
        {
            try
            {
                string mail = user.clsPersona.email;
                DBEntity ent = new DBEntity();

                var selectu = from q in ent.persona where q.email == mail
                               join w in ent.usuario on q.id_persona equals w.persona select w;
                if (selectu.Count() == 0) { return false; }
                var sel = selectu.First();
                try
                {
                    var selectpersona = sel.persona1;
                    user.clsPersona.apellido = selectpersona.apellido;
                    user.clsPersona.direccion = selectpersona.direccion;
                    user.clsPersona.email = selectpersona.email; 
                    user.clsPersona.id_persona = selectpersona.id_persona;
                    user.clsPersona.identificacion = selectpersona.identificacion;
                    user.clsPersona.imagen = selectpersona.imagen;
                    user.clsPersona.nombre = selectpersona.nombre;
                    user.clsPersona.nombres_completos = selectpersona.nombre + " " + selectpersona.apellido;
                    user.clsPersona.telefono = selectpersona.telefono;
                }
                catch (Exception) { }

                user.estado = sel.estado;
                user.persona = Convert.ToInt32(sel.persona);
                user.id_usuario = sel.id_usuario;
                user.nombre_usuario = sel.nombre_usuario;
                user.tipo_usuario = Convert.ToInt32(sel.tipo_usuario);
                user.contrasenaString = System.Text.Encoding.UTF7.GetString(sel.contrasena);
                return true;
            }
            catch (Exception ex)
            {
                //RegistroEvento(ex.Message + "------ INICIO SESION", user.id_usuario);
                return false;
            }
        }
        public static bool SolicitudRegistro(clsUsuario user,ref string msg)
        {
            try
            {
                int id = 1;
                try
                {
                    DBEntity ent2 = new DBEntity();
                    id = (from q in ent2.usuario select q.id_usuario).Max() + 1;
                }catch (Exception){}
                clsPersona cls = new clsPersona();
                cls = user.clsPersona;
                if (IngresoPersona(ref cls, ref msg))
                {
                    using (DBEntity ent = new DBEntity())
                    {
                        usuario us = new usuario()
                        {
                            id_usuario = id,
                            nombre_usuario = user.nombre_usuario,
                            tipo_usuario = 3,
                            estado = "A",
                            persona = user.clsPersona.id_persona,
                            contrasena = Encoding.UTF8.GetBytes(user.contrasenaString2)
                        };
                        ent.usuario.Add(us);
                        ent.SaveChanges();
                    }
                }
                else { return false; }
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
        public static bool IngresoPersona(ref clsPersona cls, ref string msg)
        {
            try
            {
                try
                {
                    DBEntity ent1 = new DBEntity();
                    cls.id_persona = (from q in ent1.persona select q.id_persona).Max() + 1;
                }
                catch (Exception) { cls.id_persona = 0; }
                
                using (DBEntity ent = new DBEntity())
                {
                    persona per = new persona()
                    {
                        id_persona = cls.id_persona,
                        identificacion = cls.identificacion,
                        nombre = cls.nombre,
                        apellido = cls.apellido,

                        email = cls.email,
                        telefono = cls.telefono,
                        direccion = cls.direccion
                        //estado = cls.estado
                    };
                    ent.persona.Add(per);
                    ent.SaveChanges();
                }

                return true;
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                return false;
            }
        }
        public static bool ModificaPersona(clsPersona cls, ref string msg)
        {
            try
            {
                DBEntity ent = new DBEntity();
                var mod = (from q in ent.persona where q.id_persona==cls.id_persona select q).FirstOrDefault();
                if(cls.imagen!=null)
                    mod.imagen = cls.imagen;
                mod.nombre = cls.nombre;
                mod.apellido = cls.apellido;
                mod.identificacion = cls.identificacion;
                mod.email = cls.email;

                mod.direccion = cls.direccion;
                mod.telefono = cls.telefono;
                ent.SaveChanges();
                
                return true;
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                return false;
            }
        }
        public static bool ModificaUsuario(clsUsuario cls, ref string msg)
        {
            try
            {
                DBEntity ent = new DBEntity();
                var mod = (from q in ent.usuario where q.id_usuario == cls.id_usuario select q).FirstOrDefault();
                mod.contrasena = Encoding.UTF8.GetBytes(cls.contrasenaString);
                ent.SaveChanges();

                return true;
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                return false;
            }
        }

        #endregion 
        #region producto
        public static List<JScombo> ConsultaProductoCombo()
        {
            try
            {
                List<JScombo> lst = new List<JScombo>();
                DBEntity ent = new DBEntity();
                var sel = from q in ent.producto where q.estado != "I" select q;
                foreach (var item in sel)
                {
                    JScombo cls = new JScombo();
                    cls.value = item.id_producto;
                    cls.text = item.nombre;
                    lst.Add(cls);
                }
                return lst;
            }
            catch (Exception)
            {
                return null;
            }
        }
        public static List<clsProducto> ConsultaProducto()
        {
            try
            {
                List<clsProducto> lst = new List<clsProducto>();
                DBEntity ent = new DBEntity();
                var sel = from q in ent.producto select q;
                foreach (var item in sel)
                {
                    clsProducto cls = new clsProducto();
                    cls.cantidad = Convert.ToInt32(item.cantidad);
                    cls.estado = item.estado;
                    cls.id_producto = item.id_producto;
                    cls.nombre = item.nombre;
                    cls.precio = Convert.ToDecimal(item.precio);
                    cls.tipo_producto = item.tipo_producto;
                    lst.Add(cls);
                }
                return lst;
            }
            catch (Exception)
            {
                return null;
            }
        }
        public static bool EliminaActivaProducto(int id, ref string msg)
        {
            try
            {
                DBEntity ent = new DBEntity();
                var sel = (from q in ent.producto where q.id_producto == id select q).FirstOrDefault();
                sel.estado = sel.estado == "I" ? "A" : "I";
                ent.SaveChanges();
                return true;
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                return false;
            }
        }
        #endregion
        public static List<clsEvento> ConsultaEventos(clsUsuario user=null,decimal siguiente=0)
        {
            try
            {
                List<clsEvento> lst = new List<clsEvento>();
                DBEntity ent=new DBEntity();
                var sel = (from q in ent.evento where q.estado!="I" && q.id_evento<(siguiente==0?99999:siguiente)
                           join w in ent.usuario on q.id_usuario equals w.id_usuario
                           orderby q.id_evento descending
                           select new { q, w.nombre_usuario }).Take(5).ToList();

                foreach (var item in sel)
                {
                    clsEvento cls = new clsEvento();
                    cls.nombre_usuario = item.nombre_usuario;
                    cls.descripcion= item.q.descripcion;
                    cls.estado = item.q.estado;
                    cls.fecha_creacion = item.q.fecha_creacion;
                    cls.fecha_desde = item.q.fecha_desde;
                    cls.fecha_fin = item.q.fecha_fin;
                    cls.id_evento = item.q.id_evento;
                    cls.id_usuario = Convert.ToInt32(item.q.id_usuario);
                    cls.tipo_evento = item.q.tipo_evento;
                    lst.Add(cls);
                }
                return lst;
            }
            catch (Exception)
            {
                return null;
            }

        }
        public static bool IngresoEventos(ref clsEvento cls, ref string msg)
        {
            try
            {
                try
                {
                    DBEntity ent1 = new DBEntity();
                    cls.id_evento = (from q in ent1.evento select q.id_evento).Max() + 1;
                }
                catch (Exception) { cls.id_evento = 1; }
                using (DBEntity ent = new DBEntity())
                {
                    evento even = new evento()
                    {
                        descripcion = cls.descripcion,
                        estado = "A",
                        fecha_creacion = cls.fecha_creacion,
                        fecha_desde = cls.fecha_desde,
                        fecha_fin = cls.fecha_fin,
                        id_evento = cls.id_evento,
                        id_usuario = cls.id_usuario,
                        tipo_evento = cls.tipo_evento,
                    };
                    ent.evento.Add(even);
                    ent.SaveChanges();
                }
                return true;
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                return false;
            }
        }
        public static clsPersona ConsultaPersona(string identificacion)
        {
            try
            {
                clsPersona cls = new clsPersona();
                return cls;
            }
            catch (Exception)
            {
                return null;
            }
        
        }
        public static List<clsMenu> ConsultaMenu(int tipo_usuario = 0)
        {
            try
            {
                if (tipo_usuario == 0)
                    return null;
                List<clsMenu> list = new List<clsMenu>();
                DBEntity ent = new DBEntity();
                //var select2 = from q in ent.menu
                //            where q.estado != "I"
                //             join w in ent.menu_x_tipo_usuario on q.id_menu equals w.id_menu into e
                //            from t in e.DefaultIfEmpty()
                //            where t.tipo_usuario == tipo_usuario || t.tipo_usuario == null
                //             select new { q, tipo_usuario = t.tipo_usuario == null ? 0 : t.tipo_usuario, t.visible };

                //var select = (from q in ent.menu
                //              where q.estado != "I"
                //              join w in ent.menu_x_tipo_usuario on q.id_menu equals w.id_menu into e
                //              from t in e.DefaultIfEmpty()
                              
                //              //where t.tipo_usuario == tipo_usuario || t.tipo_usuario == null
                //              select new { q, tipo_usuario = t.tipo_usuario == tipo_usuario ? t.tipo_usuario : 0, visible = t.tipo_usuario == tipo_usuario ? t.visible : null }).ToList();
                var select = from q in ent.menu where q.estado != "I" select q;
                var selectxtipo = from q in ent.menu_x_tipo_usuario where q.tipo_usuario == tipo_usuario select q;
                bool flag = true;   
                foreach (var item1 in select)
                {
                    clsMenu cls2 = new clsMenu();
                    cls2.nombre = item1.nombre;
                    cls2.direccion = item1.direccion;
                    cls2.id_menu = item1.id_menu;
                    cls2.id_sub_menu = item1.id_sub_menu;
                    cls2.estado = item1.estado;
                    
                    foreach (var item2 in selectxtipo)
                    {
                        if (item1.id_menu == item2.id_menu)
                        {
                            cls2.tipo_usuario = item2.tipo_usuario;
                            cls2.visible = item2.visible;
                            list.Add(cls2);
                            flag = false;
                        }
                    }
                    if (flag)
                        list.Add(cls2);
                    else
                        flag = true;
                }
                return list;
            }
            catch (Exception ex)
            {
                return null;
            }

        }
        public static bool IngresoMenuxTipoUsuario(clsMenuxTipoUsuario cls, ref string msg)
        {
            try
            {
                try
                {
                    DBEntity ent1 = new DBEntity();
                    var menu = (from q in ent1.menu_x_tipo_usuario where q.id_menu==cls.id_menu && q.tipo_usuario==cls.tipo_usuario select q).FirstOrDefault();
                    menu.visible = cls.visible;
                    ent1.SaveChanges();
                    return true;
                }
                catch (Exception) { }
                using (DBEntity ent = new DBEntity())
                {
                    menu_x_tipo_usuario even = new menu_x_tipo_usuario()
                    {
                        id_menu = cls.id_menu,
                        tipo_usuario = cls.tipo_usuario,
                        visible = cls.visible,
                    };
                    ent.menu_x_tipo_usuario.Add(even);
                    ent.SaveChanges();
                }
                return true;
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                return false;
            }
        }
        public static List<clsTipo_usuario> ConsultaTipoUsuario()
        {
            try
            {
                List<clsTipo_usuario> lst = new List<clsTipo_usuario>();
                DBEntity ent = new DBEntity();

                var sel = from q in ent.tipo_usuario select q;

                foreach (var item in sel)
                {
                    clsTipo_usuario cls = new clsTipo_usuario();
                    cls.id_tipo_usuario = item.id_tipo_usuario;
                    cls.descripcion = item.descripcion;
                    lst.Add(cls);
                }
                return lst;
            }
            catch (Exception)
            {
                return null;
            }
        }
        public static bool ModificaCreaProducto(clsProducto cls, ref string msg)
        {
            try
            {
                DBEntity ent = new DBEntity();
                if (cls.id_producto == 0)
                {
                    try
                    {
                        ent = new DBEntity();
                        cls.id_producto = (from q in ent.producto select q.id_producto).Max() + 1;
                    }
                    catch (Exception) { cls.id_producto = 1; }

                    ent = new DBEntity();
                    producto pro = new producto() {
                        id_producto = cls.id_producto,
                        nombre=cls.nombre,
                        cantidad=cls.cantidad,
                        precio=cls.precio,
                        tipo_producto=cls.tipo_producto,
                        estado="A"
                    };
                    ent.producto.Add(pro);
                    ent.SaveChanges();
                }
                else
                {
                    ent = new DBEntity();
                    var sel = (from q in ent.producto where q.id_producto == cls.id_producto select q).FirstOrDefault();
                    sel.cantidad = cls.cantidad;
                    sel.nombre = cls.nombre.Trim();
                    sel.precio = cls.precio;
                    sel.tipo_producto = cls.tipo_producto.Trim();
                    ent.SaveChanges();
                }
                return true;
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                return false;
            }
        }
        public static List<clsPersona> ConsultaPersona(int id=0,string identifiacion="")
        {
            try
            {
                List<clsPersona> lst = new List<clsPersona>();
                DBEntity ent = new DBEntity();
                IQueryable<persona> sel=null;
                if(id==0 && identifiacion=="")
                    sel = from q in ent.persona select q;
                if (id != 0 )
                    sel = from q in ent.persona where q.id_persona==id select q;
                if (identifiacion != "")
                    sel = from q in ent.persona where q.identificacion == identifiacion select q;

                foreach (var item in sel)
                {
                    clsPersona cls = new clsPersona();
                    cls.apellido = item.apellido;
                    cls.direccion = item.direccion;
                    cls.email = item.email;
                    cls.id_persona = item.id_persona;
                    cls.identificacion = item.identificacion;
                    cls.nombre = item.nombre;
                    cls.imagen = item.imagen;
                    cls.nombres_completos = item.nombre+" "+item.apellido;
                    cls.telefono = item.telefono;
                    lst.Add(cls);
                }
                return lst;
            }
            catch (Exception)
            {
                return null;
            }
        }
        public static bool IngresoCab(ref clsDocumento_cab cls,ref string msg) 
        {
            try
            {
                try{
	                DBEntity ent1 = new DBEntity();
                    cls.id_doc_cab = (from q in ent1.documento_cab select q.id_doc_cab).Max()+1;
                }catch (Exception) { cls.id_doc_cab = 1; }
                try
                {
                    string cod=cls.cod_documento;
                    DBEntity ent1 = new DBEntity();
                    int count = (from q in ent1.documento_cab where q.cod_documento==cod select q.id_doc_cab).Count();
                    if (count > 0) { cls.error = "Codigo del Documento ya existe"; return false; }
                }catch (Exception) {}
                //try
                //{
                //    DBEntity ent1 = new DBEntity();
                //    int id = cls.id_doc_cab;
                //    var count = (from q in ent1.documento_cab where q.id_doc_cab==id select q.id_doc_cab);
                //    if (count.Count() > 0)
                //    {
                //        EditaCab(ref cls, ref msg);
                //        return true;
                //    }
                //}catch (Exception){}
                using (DBEntity ent=new DBEntity())
                {
                    documento_cab cab = new documento_cab() { 
                        id_doc_cab=cls.id_doc_cab,
                        cod_documento = cls.cod_documento == "" ? "COT"+cls.id_doc_cab : cls.cod_documento,
                        tipo_doc = cls.tipo_doc,
                        fecha = Convert.ToDateTime(cls.fecha),
                        
                        cliente = cls.clsPersona.id_persona,
                        sub_total = cls.sub_total,
                        descuento = cls.descuento,
                        iva = cls.iva,
                        descripcion = cls.descripcion,
                        total = cls.total,
                        fecha_creacion = DateTime.Now,
                        usuario_crea = cls.usuario_crea,
                        estado="A"
                    };
                    ent.documento_cab.Add(cab);
                    ent.SaveChanges();
                }

                return true;
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                return false;
            }
        }
        public static bool EditaCab(ref clsDocumento_cab cls,ref string msg) 
        {
            try
            {

                DBEntity ent = new DBEntity();
                int id=cls.id_doc_cab;
                var sel = ent.documento_cab.Where(q => q.id_doc_cab == id).First();
                        sel.tipo_doc = cls.tipo_doc;
                        sel.fecha = Convert.ToDateTime(cls.fecha);
                        sel.cliente = cls.clsPersona.id_persona;
                        sel.sub_total = cls.sub_total;
                        sel.descuento = cls.descuento;
                        sel.iva = cls.iva;
                        sel.total = cls.total;
                        sel.fecha_modificacion = DateTime.Now;
                        sel.usuario_modifica = cls.usuario_modifica;
                    ent.SaveChanges();

                return true;
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                return false;
            }
        }
        public static bool IngresoCliente(ref clsPersona cls, ref string msg)
        {
            try
            {
                try
                {
                    DBEntity ent1 = new DBEntity();
                    string id = cls.identificacion;
                    var count = (from q in ent1.persona where q.identificacion==id select q).FirstOrDefault();
                    if (count != null)
                    {
                        cls.id_persona = count.id_persona;

                        count.email = cls.email;
                        count.telefono = cls.telefono;
                        count.direccion = cls.direccion;
                        ent1.SaveChanges();
                        return true;
                    }
                }
                catch (Exception) {  }
                return IngresoPersona(ref cls, ref msg);
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                return false;
            }
        }
        public static bool IngresoDet(clsDocumento_det cls, ref string msg)
        {
            try
            {
                using (DBEntity ent = new DBEntity())
                {
                    documento_det det = new documento_det()
                    {
                        id_doc_cab = cls.id_doc_cab,
                        id_doc_det = cls.id_doc_det,
                        id_producto = cls.id_producto,
                        precio = cls.precio,
                    };
                    ent.documento_det.Add(det);
                    ent.SaveChanges();
                }
                return true;
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                return false;
            }
        }

        public static List<clsDocumento_cab> ConsultaCabecera(int id=0,string cod="")
        {
            try
            {
                List<clsDocumento_cab> lst = new List<clsDocumento_cab>();
                DBEntity ent = new DBEntity();
                List<documento_cab> sel=new List<documento_cab>();
                if(id>0)
                    sel = ent.documento_cab.Where(q=>q.id_doc_cab==id).ToList();
                if(cod!="")
                    sel = ent.documento_cab.Where(q => q.cod_documento == cod).ToList();

                foreach (var item in sel)
                {
                    clsDocumento_cab cls = new clsDocumento_cab();
                    cls.clsPersona.id_persona = Convert.ToInt32(item.cliente);
                    cls.cod_documento = item.cod_documento;
                    cls.descuento = Convert.ToDecimal(item.descuento);
                    cls.estado = item.estado;
                    cls.descripcion = item.descripcion;
                    cls.fecha = Convert.ToDateTime(item.fecha).ToString("MM/dd/yyyy");
                    cls.fecha_creacion = Convert.ToDateTime(item.fecha_creacion);
                    cls.fecha_modificacion = Convert.ToDateTime(item.fecha_modificacion);
                    cls.id_doc_cab = item.id_doc_cab;
                    cls.iva = Convert.ToDecimal(item.iva);
                    cls.sub_total = Convert.ToDecimal(item.sub_total);
                    cls.tipo_doc = item.tipo_doc;
                    cls.total = Convert.ToDecimal(item.total);
                    cls.usuario_crea = item.usuario_crea;
                    cls.usuario_modifica = item.usuario_modifica;
                    
                    lst.Add(cls);
                }
                return lst;
            }
            catch (Exception)
            {
                return null;
            }
        }
        public static List<clsDocumento_det> ConsultaDetalle(int cabecera)
        {
            try
            {
                List<clsDocumento_det> lst = new List<clsDocumento_det>();
                DBEntity ent = new DBEntity();
                var sel = ent.documento_det.Where(q => q.id_doc_cab == cabecera).ToList();
                foreach (var item in sel)
                {
                    clsDocumento_det cls = new clsDocumento_det();
                    cls.id_doc_cab = item.id_doc_cab;
                    cls.id_doc_det = item.id_doc_det;
                    cls.id_producto = item.id_producto;
                    cls.precio = Convert.ToDecimal(item.precio);
                    lst.Add(cls);
                }
                return lst;
            }
            catch (Exception)
            {
                return null;
            }
        }
    }
}